Android启动画面自定义

怎么偷懒?

Android应用程序在启动的时候(尤其是第一次启动),从点击应用程序图标启动到Activity的onCreate方法是需要一定的时间的。一般情况下我们会设置应用程序的Splash Sreen图片,显示一个图片来避免白屏。但是这个启动图片为了应对不同的设备屏幕,往往需要很多不同的分辨率。作为一个程序员,当然希望采取一种能够适应所有屏幕的方式,怎么偷懒呢?

Activity的主题

  • 用户从启动一个应用,系统先解析该应用启动 Activity 所使用的主题(Theme,在Manifest 文件中定义的),并根据里面定义的基本元素来绘制一个初始界面,比如根据主题中定义的状态栏颜色和窗口背景( android:windowBackground)。
  • 当系统加载完该程序的所有资源并执行启动 Activity 的 onCreate 函数之后,就把初始界面替换为该 Activity 的实际界面。

窗口背景

所以,我们可以声明一个style,并且指定窗口背景

1
2
3
<style name="AppTheme.Loading" parent="AppTheme.NoActionBar">
<item name="android:windowBackground">@drawable/loading_background</item>
</style>

shape和layer-list

背景中的drawable可以通过shape或者layer-list来配置,这里只是简单的使用了一个渐变的背景

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient android:angle="90"
android:startColor="@color/colorPrimary"
android:endColor="@color/colorPrimaryDark">
</gradient>
</shape>

回到原来的主题

在Activity的onCreate方法中可以设置回到原来的主题

1
2
3
4
5
6
7
8
9
public class LoadingActivity extends BaseActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// 必须在 super.onCreate 之前调用
setTheme(R.style.MyTheme); //设定原来的主题
super.onCreate(savedInstanceState);
// ...
}
}

优点

使用这种方式实现的 启动界面类似于效果上类似于传统的 Splash 界面,但是有很多好处:

  1. 没有额外的 Splash Activity,我看到过很多开发者为了实现 设计师要求的 Splash 界面,单独使用一个 Activity 来显示 Splash 界面,并且等待一段时间(比如 5秒)后再 finish 该界面。
  2. 没有额外的性能损耗,这是利用系统特性来实现一个启动界面,并不需要单独实现一个 Activity 来消耗系统的资源。
  3. 没有额外的过度绘制。在 onCreate 函数中重新设置为正常的 theme,可以把自定义的启动背景图给删除掉,避免主题背景和自定义 View 背景造成的过度绘制。 你也可以通过  getWindow().setBackgroundDrawable(null); 来清除该自定义启动背景。
  4. 启动速度更快。由于没有额外的 Splash Activity,启动速度当然很快。给用户带来愉悦的体验。

参考

Android 应用启动界面自定义